/*
* Copyright (C) 2006, 2007 Dennis Hunziker, Ueli Kistler
* Copyright (C) 2007 Reto Schuettel, Robin Stocker
*/
package org.python.pydev.refactoring.tests.coderefactoring.extractmethod;
import java.util.SortedMap;
import java.util.TreeMap;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.Document;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.ITextSelection;
import org.eclipse.jface.text.TextSelection;
import org.eclipse.text.edits.MalformedTreeException;
import org.eclipse.text.edits.MultiTextEdit;
import org.python.pydev.core.FileUtilsFileBuffer;
import org.python.pydev.core.IGrammarVersionProvider;
import org.python.pydev.core.MisconfigurationException;
import org.python.pydev.parser.jython.ast.Module;
import org.python.pydev.refactoring.ast.adapters.AbstractScopeNode;
import org.python.pydev.refactoring.ast.adapters.ModuleAdapter;
import org.python.pydev.refactoring.ast.visitors.VisitorFactory;
import org.python.pydev.refactoring.coderefactoring.extractmethod.edit.ExtractCallEdit;
import org.python.pydev.refactoring.coderefactoring.extractmethod.edit.ExtractMethodEdit;
import org.python.pydev.refactoring.coderefactoring.extractmethod.edit.ParameterReturnDeduce;
import org.python.pydev.refactoring.coderefactoring.extractmethod.request.ExtractMethodRequest;
import org.python.pydev.refactoring.core.base.RefactoringInfo;
import org.python.pydev.refactoring.tests.adapter.PythonNatureStub;
import org.python.pydev.refactoring.tests.core.AbstractIOTestCase;
import com.thoughtworks.xstream.XStream;
public class ExtractMethodTestCase extends AbstractIOTestCase {
private static final int EXTENSION = 4;
public ExtractMethodTestCase(String name) {
super(name);
}
@Override
public void runTest() throws Throwable {
FileUtilsFileBuffer.IN_TESTS = true;
MockupExtractMethodConfig config = initConfig();
IDocument doc = new Document(data.source);
Module astModule = VisitorFactory.getRootNode(doc, createVersionProvider());
String name = data.file.getName();
name = name.substring(0, name.length() - EXTENSION);
ModuleAdapter module = new ModuleAdapter(null, data.file, doc, astModule, new PythonNatureStub());
if (data.sourceSelection == null) {
System.out.println("here");
}
ITextSelection selection = new TextSelection(doc, data.sourceSelection.getOffset(),
data.sourceSelection.getLength());
RefactoringInfo info = new RefactoringInfo(doc, selection, new IGrammarVersionProvider() {
public int getGrammarVersion() throws MisconfigurationException {
return IGrammarVersionProvider.GRAMMAR_PYTHON_VERSION_2_7;
}
});
MockupExtractMethodRequestProcessor requestProcessor = setupRequestProcessor(config, module, info);
IDocument refactoringDoc = applyExtractMethod(info, requestProcessor);
this.setTestGenerated(refactoringDoc.get());
assertContentsEqual(getExpected(), getGenerated());
FileUtilsFileBuffer.IN_TESTS = false;
}
private IDocument applyExtractMethod(RefactoringInfo info, MockupExtractMethodRequestProcessor requestProcessor)
throws BadLocationException, MalformedTreeException, MisconfigurationException {
ExtractMethodRequest req = requestProcessor.getRefactoringRequests().get(0);
ExtractMethodEdit extractedMethodEdit = new ExtractMethodEdit(req);
ExtractCallEdit callExtractedMethodEdit = new ExtractCallEdit(req);
MultiTextEdit edit = new MultiTextEdit();
edit.addChild(extractedMethodEdit.getEdit());
edit.addChild(callExtractedMethodEdit.getEdit());
IDocument refactoringDoc = new Document(data.source);
edit.apply(refactoringDoc);
return refactoringDoc;
}
private MockupExtractMethodRequestProcessor setupRequestProcessor(MockupExtractMethodConfig config,
ModuleAdapter module, RefactoringInfo info) {
ModuleAdapter parsedSelection = info.getParsedExtendedSelection();
AbstractScopeNode<?> scope = module.getScopeAdapter(info.getExtendedSelection());
ParameterReturnDeduce deducer = new ParameterReturnDeduce(scope, info.getExtendedSelection(), module);
SortedMap<String, String> renameMap = new TreeMap<String, String>();
for (String variable : deducer.getParameters()) {
String newName = variable;
if (config.getRenameMap().containsKey(variable)) {
newName = config.getRenameMap().get(variable);
}
renameMap.put(variable, newName);
}
return new MockupExtractMethodRequestProcessor(scope, info.getExtendedSelection(), parsedSelection, deducer,
renameMap, config.getOffsetStrategy());
}
private MockupExtractMethodConfig initConfig() {
MockupExtractMethodConfig config = null;
XStream xstream = new XStream();
xstream.alias("config", MockupExtractMethodConfig.class);
if (data.config.length() > 0) {
config = (MockupExtractMethodConfig) xstream.fromXML(data.getConfigContents());
} else {
config = new MockupExtractMethodConfig();
}
return config;
}
}